/*-------------------------------------------------------------------------
 *
 * dict_int.c
 *	  Text search dictionary for integers
 *
 * Copyright (c) 2007-2012, PostgreSQL Global Development Group
 *
 * IDENTIFICATION
 *	  contrib/dict_int/dict_int.c
 *
 *-------------------------------------------------------------------------
 */
#include "postgres.h"
#include "knl/knl_variable.h"

#include "commands/defrem.h"
#include "tsearch/ts_public.h"

PG_MODULE_MAGIC;

typedef struct {
    int maxlen;
    bool rejectlong;
} DictInt;

PG_FUNCTION_INFO_V1(dintdict_init);
extern "C" Datum dintdict_init(PG_FUNCTION_ARGS);

PG_FUNCTION_INFO_V1(dintdict_lexize);
extern "C" Datum dintdict_lexize(PG_FUNCTION_ARGS);

Datum dintdict_init(PG_FUNCTION_ARGS)
{
    List* dictoptions = (List*)PG_GETARG_POINTER(0);
    DictInt* d = NULL;
    ListCell* l = NULL;

    d = (DictInt*)palloc0(sizeof(DictInt));
    d->maxlen = 6;
    d->rejectlong = false;

    foreach (l, dictoptions) {
        DefElem* defel = (DefElem*)lfirst(l);

        if (pg_strcasecmp(defel->defname, "MAXLEN") == 0) {
            d->maxlen = atoi(defGetString(defel));
        } else if (pg_strcasecmp(defel->defname, "REJECTLONG") == 0) {
            d->rejectlong = defGetBoolean(defel);
        } else {
            ereport(ERROR,
                (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                    errmsg("unrecognized intdict parameter: \"%s\"", defel->defname)));
        }
    }

    PG_RETURN_POINTER(d);
}

Datum dintdict_lexize(PG_FUNCTION_ARGS)
{
    DictInt* d = (DictInt*)PG_GETARG_POINTER(0);
    char* in = (char*)PG_GETARG_POINTER(1);
    char* txt = pnstrdup(in, PG_GETARG_INT32(2));
    TSLexeme* res = (TSLexeme*)palloc0(sizeof(TSLexeme) * 2);

    res[1].lexeme = NULL;
    if (PG_GETARG_INT32(2) > d->maxlen) {
        if (d->rejectlong) {
            /* reject by returning void array */
            pfree(txt);
            res[0].lexeme = NULL;
        } else {
            /* trim integer */
            txt[d->maxlen] = '\0';
            res[0].lexeme = txt;
        }
    } else {
        res[0].lexeme = txt;
    }

    PG_RETURN_POINTER(res);
}
